home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ELYVER10.ZIP / MIKXMAS.ZIP / source / mwav.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-12-12  |  2.4 KB  |  144 lines

  1. /*
  2.  
  3. Name:
  4. MWAV.C
  5.  
  6. Description:
  7. WAV sample loader
  8.  
  9. Portability:
  10.  
  11. MSDOS:    BC(y)    Watcom(y)    DJGPP(?)
  12. Win95:    BC(n)
  13. Linux:    n
  14.  
  15. (y) - yes
  16. (n) - no (not possible or not useful)
  17. (?) - may be possible, but not tested
  18.  
  19. */
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23.  
  24. #include "mikmod.h"
  25.  
  26.  
  27. typedef struct WAV{
  28.     char  rID[4];
  29.     ULONG rLen;
  30.     char  wID[4];
  31.     char  fID[4];
  32.     ULONG fLen;
  33.     UWORD wFormatTag;
  34.     UWORD nChannels;
  35.     ULONG nSamplesPerSec;
  36.     ULONG nAvgBytesPerSec;
  37.     UWORD nBlockAlign;
  38.     UWORD nFormatSpecific;
  39. } WAV;
  40.  
  41.  
  42.  
  43. SAMPLE *MW_LoadWavFP(FILE *fp)
  44. {
  45.     SAMPLE *si;
  46.     static WAV wh;
  47.     static char dID[4];
  48.  
  49.     _mm_rewind(fp);
  50.  
  51.     /* read wav header */
  52.  
  53.         _mm_read_str(wh.rID,4,fp);
  54.     wh.rLen=_mm_read_I_ULONG(fp);
  55.         _mm_read_str(wh.wID,4,fp);
  56.         _mm_read_str(wh.fID,4,fp);
  57.     wh.fLen=_mm_read_I_ULONG(fp);
  58.     wh.wFormatTag=_mm_read_I_UWORD(fp);
  59.     wh.nChannels=_mm_read_I_UWORD(fp);
  60.     wh.nSamplesPerSec=_mm_read_I_ULONG(fp);
  61.     wh.nAvgBytesPerSec=_mm_read_I_ULONG(fp);
  62.     wh.nBlockAlign=_mm_read_I_UWORD(fp);
  63.     wh.nFormatSpecific=_mm_read_I_UWORD(fp);
  64.  
  65.     /* check it */
  66.  
  67.     if( feof(fp) ||
  68.         memcmp(wh.rID,"RIFF",4) ||
  69.         memcmp(wh.wID,"WAVE",4) ||
  70.         memcmp(wh.fID,"fmt ",4) ){
  71.         myerr="Not a WAV file";
  72.         return NULL;
  73.     }
  74.  
  75.     /* skip other crap */
  76.  
  77.     _mm_fseek(fp,wh.fLen-16,SEEK_CUR);
  78.         _mm_read_str(dID,4,fp);
  79.  
  80.     if( memcmp(dID,"data",4) ){
  81.         myerr="Not a WAV file";
  82.         return NULL;
  83.     }
  84.  
  85.     if(wh.nChannels>1){
  86.         myerr="Only mono WAV's are supported";
  87.         return NULL;
  88.     }
  89.  
  90. /*  printf("wFormatTag: %x\n",wh.wFormatTag); */
  91. /*  printf("blockalign: %x\n",wh.nBlockAlign); */
  92. /*  prinff("nFormatSpc: %x\n",wh.nFormatSpecific); */
  93.  
  94.         if((si=(SAMPLE *)calloc(1,sizeof(SAMPLE)))==NULL){
  95.         myerr="Out of memory";
  96.         return NULL;
  97.     };
  98.  
  99.     si->c2spd=8192;
  100.     si->volume=64;
  101.  
  102.     si->length=_mm_read_I_ULONG(fp);
  103.  
  104.     if(wh.nBlockAlign==2){
  105.         si->flags=SF_16BITS|SF_SIGNED;
  106.         si->length>>=1;
  107.     }
  108.  
  109.     si->handle=MD_SampleLoad(fp,si->length,0,si->length,si->flags);
  110.  
  111.     if(si->handle<0){
  112.         free(si);
  113.         return NULL;
  114.     }
  115.  
  116.     return si;
  117. }
  118.  
  119.  
  120. SAMPLE *MW_LoadWavFN(char *filename)
  121. {
  122.     FILE *fp;
  123.     SAMPLE *si;
  124.  
  125.     if((fp=fopen(filename,"rb"))==NULL){
  126.         myerr="Couldn't open wav file";
  127.         return NULL;
  128.     }
  129.  
  130.     si=MW_LoadWavFP(fp);
  131.  
  132.     fclose(fp);
  133.     return si;
  134. }
  135.  
  136.  
  137. void MW_FreeWav(SAMPLE *si)
  138. {
  139.     if(si!=NULL){
  140.         MD_SampleUnLoad(si->handle);
  141.         free(si);
  142.     }
  143. }
  144.